package weibo

import (
	"github.com/crozz-net/gopenapi/request"
	"github.com/crozz-net/gopenapi/weibo/model"
	"net/url"
)

const BASE_URL = "https://api.weibo.com/2/"

type Weibo struct {
	Client_id     string
	Client_secret string
	Redirect_uri  string
	Users         api_user
	Common        api_common
	Short_url     api_short_url
}

func NewWeibo(client_id, client_secret, redirect_uri string) *Weibo {
	return &Weibo{
		Client_id:     client_id,
		Client_secret: client_secret,
		Redirect_uri:  redirect_uri,
		Users:         api_user{client_id: client_id},
		Common:        api_common{client_id: client_id},
		Short_url: api_short_url{
			client_id: client_id,
			Share:     api_short_url_share{client_id: client_id},
			Comment:    api_short_url_comment{client_id: client_id},
		},
	}
}

/**
 * OAuth2的authorize接口<br/>
 * 文档地址：http://open.weibo.com/wiki/Oauth2/authorize
 *
 * @param client_id    申请应用时分配的AppKey。
 * @param redirect_uri 授权回调地址，站外应用需与设置的回调地址一致，站内应用需填写canvas page的地址。
 * @param scope        申请scope权限所需参数，可一次申请多个scope权限，用逗号分隔。<a
 *                     href="http://open.weibo.com/wiki/Scope">使用文档</a>
 * @param state        用于保持请求和回调的状态，在回调时，会在Query
 *                     Parameter中回传该参数。开发者可以用这个参数验证请求有效性，
 *                     也可以记录用户请求授权页前的位置。这个参数可用于防止跨站请求伪造（CSRF）攻击
 * @param display      授权页面的终端类型，取值见下面的说明。
 * @param forcelogin   是否强制用户重新登录，true：是，false：否。默认false。
 * @param language     授权页语言，缺省为中文简体版，en为英文版。
 */
func (this *Weibo) Authorize(scope, state, display, forcelogin, language string) string {
	param := url.Values{}
	param.Add("client_id", this.Client_id)
	param.Add("redirect_uri", this.Redirect_uri)
	param.Add("scope", scope)
	param.Add("state", state)
	param.Add("display", display)
	param.Add("forcelogin", forcelogin)
	param.Add("language", language)

	return "https://api.weibo.com/oauth2/authorize" + param.Encode()
}

/**
 * OAuth2的access_token接口<br/>
 * http://open.weibo.com/wiki/OAuth2/access_token
 *
 * @param client_id     申请应用时分配的AppKey。
 * @param client_secret 申请应用时分配的AppSecret。
 * @param grant_type    请求的类型，填写"authorization_code"
 * @param code          <b color='red'>grant_type为authorization_code时</b>，调用authorize获得的code值。
 * @param redirect_uri  <b color='red'>grant_type为authorization_code时</b>，回调地址，需需与注册应用里的回调地址一致。
 */
func (this *Weibo) Access_token(grant_type, code string) (*model.Resp_token, error) {
	param := url.Values{}
	param.Add("client_id", this.Client_id)
	param.Add("client_secret", this.Client_secret)
	param.Add("redirect_uri", this.Redirect_uri)
	param.Add("grant_type", grant_type)
	param.Add("code", code)

	resp_token := &model.Resp_token{}
	err := request.HttpGetAsObj("https://api.weibo.com/oauth2/access_token", param, resp_token)

	return resp_token, err
}

/**
 * 查询用户access_token的授权相关信息，包括授权时间，过期时间和scope权限。<br/>
 * http://open.weibo.com/wiki/Oauth2/get_token_info
 *
 * @param access_token 用户授权时生成的access_token。
 */
func (this *Weibo) Get_token_info(access_token string) (*model.Resp_get_token_info, error) {
	param := url.Values{}
	param.Add("access_token", access_token)

	resp_token := &model.Resp_get_token_info{}
	err := request.HttpPostAsObj("https://api.weibo.com/oauth2/get_token_info", param, resp_token)

	return resp_token, err
}
